<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/slub_def.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/slub_def.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1NMVUJfREVGX0hfMA__"><span class="b">_LINUX_SLUB_DEF_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1NMVUJfREVGX0hfMA__"><span class="b">_LINUX_SLUB_DEF_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> * SLUB : A Slab allocator without object queues.</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> * (C) 2007 SGI, Christoph Lameter</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> */</span>
<a name="9" /><span class="True">       9:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">kobject</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="10" /><span class="True">      10:</span> 
<a name="11" /><span class="True">      11:</span> <span class="m">enum</span> <span class="b">stat_item</span> <span class="f">{</span>
<a name="12" /><span class="True">      12:</span>     <span class="b">ALLOC_FASTPATH</span><span class="f">,</span>        <span class="k">/* Allocation from cpu slab */</span>
<a name="13" /><span class="True">      13:</span>     <span class="b">ALLOC_SLOWPATH</span><span class="f">,</span>        <span class="k">/* Allocation by getting a new cpu slab */</span>
<a name="14" /><span class="True">      14:</span>     <span class="b">FREE_FASTPATH</span><span class="f">,</span>        <span class="k">/* Free to cpu slab */</span>
<a name="15" /><span class="True">      15:</span>     <span class="b">FREE_SLOWPATH</span><span class="f">,</span>        <span class="k">/* Freeing not to cpu slab */</span>
<a name="16" /><span class="True">      16:</span>     <span class="b">FREE_FROZEN</span><span class="f">,</span>        <span class="k">/* Freeing to frozen slab */</span>
<a name="17" /><span class="True">      17:</span>     <span class="b">FREE_ADD_PARTIAL</span><span class="f">,</span>    <span class="k">/* Freeing moves slab to partial list */</span>
<a name="18" /><span class="True">      18:</span>     <span class="b">FREE_REMOVE_PARTIAL</span><span class="f">,</span>    <span class="k">/* Freeing removes last object */</span>
<a name="19" /><span class="True">      19:</span>     <span class="b">ALLOC_FROM_PARTIAL</span><span class="f">,</span>    <span class="k">/* Cpu slab acquired from node partial list */</span>
<a name="20" /><span class="True">      20:</span>     <span class="b">ALLOC_SLAB</span><span class="f">,</span>        <span class="k">/* Cpu slab acquired from page allocator */</span>
<a name="21" /><span class="True">      21:</span>     <span class="b">ALLOC_REFILL</span><span class="f">,</span>        <span class="k">/* Refill cpu slab from slab freelist */</span>
<a name="22" /><span class="True">      22:</span>     <span class="b">ALLOC_NODE_MISMATCH</span><span class="f">,</span>    <span class="k">/* Switching cpu slab */</span>
<a name="23" /><span class="True">      23:</span>     <span class="b">FREE_SLAB</span><span class="f">,</span>        <span class="k">/* Slab freed to the page allocator */</span>
<a name="24" /><span class="True">      24:</span>     <span class="b">CPUSLAB_FLUSH</span><span class="f">,</span>        <span class="k">/* Abandoning of the cpu slab */</span>
<a name="25" /><span class="True">      25:</span>     <span class="b">DEACTIVATE_FULL</span><span class="f">,</span>    <span class="k">/* Cpu slab was full when deactivated */</span>
<a name="26" /><span class="True">      26:</span>     <span class="b">DEACTIVATE_EMPTY</span><span class="f">,</span>    <span class="k">/* Cpu slab was empty when deactivated */</span>
<a name="27" /><span class="True">      27:</span>     <span class="b">DEACTIVATE_TO_HEAD</span><span class="f">,</span>    <span class="k">/* Cpu slab was moved to the head of partials */</span>
<a name="28" /><span class="True">      28:</span>     <span class="b">DEACTIVATE_TO_TAIL</span><span class="f">,</span>    <span class="k">/* Cpu slab was moved to the tail of partials */</span>
<a name="29" /><span class="True">      29:</span>     <span class="b">DEACTIVATE_REMOTE_FREES</span><span class="f">,</span><span class="k">/* Slab contained remotely freed objects */</span>
<a name="30" /><span class="True">      30:</span>     <span class="b">DEACTIVATE_BYPASS</span><span class="f">,</span>    <span class="k">/* Implicit deactivation */</span>
<a name="31" /><span class="True">      31:</span>     <span class="b">ORDER_FALLBACK</span><span class="f">,</span>        <span class="k">/* Number of times fallback was necessary */</span>
<a name="32" /><span class="True">      32:</span>     <span class="b">CMPXCHG_DOUBLE_CPU_FAIL</span><span class="f">,</span><span class="k">/* Failure of this_cpu_cmpxchg_double */</span>
<a name="33" /><span class="True">      33:</span>     <span class="b">CMPXCHG_DOUBLE_FAIL</span><span class="f">,</span>    <span class="k">/* Number of times that cmpxchg double did not match */</span>
<a name="34" /><span class="True">      34:</span>     <span class="b">CPU_PARTIAL_ALLOC</span><span class="f">,</span>    <span class="k">/* Used cpu partial on alloc */</span>
<a name="35" /><span class="True">      35:</span>     <span class="b">CPU_PARTIAL_FREE</span><span class="f">,</span>    <span class="k">/* Refill cpu partial on free */</span>
<a name="36" /><span class="True">      36:</span>     <span class="b">CPU_PARTIAL_NODE</span><span class="f">,</span>    <span class="k">/* Refill cpu partial from node partial */</span>
<a name="37" /><span class="True">      37:</span>     <span class="b">CPU_PARTIAL_DRAIN</span><span class="f">,</span>    <span class="k">/* Drain cpu partial to node partial */</span>
<a name="38" /><span class="True">      38:</span>     <span class="b">NR_SLUB_STAT_ITEMS</span> <span class="f">}</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="m">struct</span> <span class="b">kmem_cache_cpu</span> <span class="f">{</span>
<a name="41" /><span class="True">      41:</span>     <span class="m">void</span> <span class="f">*</span><span class="f">*</span><span class="b">freelist</span><span class="f">;</span>    <span class="k">/* Pointer to next available object */</span>
<a name="42" /><span class="True">      42:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">tid</span><span class="f">;</span>    <span class="k">/* Globally unique transaction id */</span>
<a name="43" /><span class="True">      43:</span>     <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">page</span><span class="f">;</span>    <span class="k">/* The slab from which we are allocating */</span>
<a name="44" /><span class="True">      44:</span>     <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">partial</span><span class="f">;</span>    <span class="k">/* Partially allocated frozen slabs */</span>
<a name="45" /><span class="False">      45:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_SLUB_STATS</span>
<a name="46" /><span class="False">      46:</span>     <span class="m">unsigned</span> <span class="b">stat</span><span class="f">[</span><span class="b">NR_SLUB_STAT_ITEMS</span><span class="f">]</span><span class="f">;</span>
<a name="47" /><span class="True">      47:</span> <span class="f">#</span><span class="n">endif</span>
<a name="48" /><span class="True">      48:</span> <span class="f">}</span><span class="f">;</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span> <span class="k">/*</span>
<a name="51" /><span class="True">      51:</span> <span class="k"> * Word size structure that can be atomically updated or read and that</span>
<a name="52" /><span class="True">      52:</span> <span class="k"> * contains both the order and the number of objects that a slab of the</span>
<a name="53" /><span class="True">      53:</span> <span class="k"> * given order would contain.</span>
<a name="54" /><span class="True">      54:</span> <span class="k"> */</span>
<a name="55" /><span class="True">      55:</span> <span class="m">struct</span> <span class="b">kmem_cache_order_objects</span> <span class="f">{</span>
<a name="56" /><span class="True">      56:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">x</span><span class="f">;</span>
<a name="57" /><span class="True">      57:</span> <span class="f">}</span><span class="f">;</span>
<a name="58" /><span class="True">      58:</span> 
<a name="59" /><span class="True">      59:</span> <span class="k">/*</span>
<a name="60" /><span class="True">      60:</span> <span class="k"> * Slab cache management.</span>
<a name="61" /><span class="True">      61:</span> <span class="k"> */</span>
<a name="62" /><span class="True">      62:</span> <span class="m">struct</span> <span class="b">kmem_cache</span> <span class="f">{</span>
<a name="63" /><span class="True">      63:</span>     <span class="m">struct</span> <span class="b">kmem_cache_cpu</span> <a href="cpu.c_macros_ref.html#_X19wZXJjcHVfMA__"><span class="b">__percpu</span></a> <span class="f">*</span><span class="b">cpu_slab</span><span class="f">;</span>
<a name="64" /><span class="True">      64:</span>     <span class="k">/* Used for retriving partial slabs etc */</span>
<a name="65" /><span class="True">      65:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="66" /><span class="True">      66:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">min_partial</span><span class="f">;</span>
<a name="67" /><span class="True">      67:</span>     <span class="m">int</span> <span class="b">size</span><span class="f">;</span>        <span class="k">/* The size of an object including meta data */</span>
<a name="68" /><span class="True">      68:</span>     <span class="m">int</span> <span class="b">object_size</span><span class="f">;</span>    <span class="k">/* The size of an object without meta data */</span>
<a name="69" /><span class="True">      69:</span>     <span class="m">int</span> <span class="b">offset</span><span class="f">;</span>        <span class="k">/* Free pointer offset. */</span>
<a name="70" /><span class="True">      70:</span>     <span class="m">int</span> <span class="b">cpu_partial</span><span class="f">;</span>    <span class="k">/* Number of per cpu partial objects to keep around */</span>
<a name="71" /><span class="True">      71:</span>     <span class="m">struct</span> <span class="b">kmem_cache_order_objects</span> <span class="b">oo</span><span class="f">;</span>
<a name="72" /><span class="True">      72:</span> 
<a name="73" /><span class="True">      73:</span>     <span class="k">/* Allocation and freeing of slabs */</span>
<a name="74" /><span class="True">      74:</span>     <span class="m">struct</span> <span class="b">kmem_cache_order_objects</span> <a href="cpu.c_macros_ref.html#_bWF4XzA_"><span class="b">max</span></a><span class="f">;</span>
<a name="75" /><span class="True">      75:</span>     <span class="m">struct</span> <span class="b">kmem_cache_order_objects</span> <a href="cpu.c_macros_noref.html#_bWluXzA_"><span class="b">min</span></a><span class="f">;</span>
<a name="76" /><span class="True">      76:</span>     <span class="b">gfp_t</span> <span class="b">allocflags</span><span class="f">;</span>    <span class="k">/* gfp flags to use on each alloc */</span>
<a name="77" /><span class="True">      77:</span>     <span class="m">int</span> <span class="b">refcount</span><span class="f">;</span>        <span class="k">/* Refcount for slab cache destroy */</span>
<a name="78" /><span class="True">      78:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">ctor</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="79" /><span class="True">      79:</span>     <span class="m">int</span> <span class="b">inuse</span><span class="f">;</span>        <span class="k">/* Offset to metadata */</span>
<a name="80" /><span class="True">      80:</span>     <span class="m">int</span> <span class="b">align</span><span class="f">;</span>        <span class="k">/* Alignment */</span>
<a name="81" /><span class="True">      81:</span>     <span class="m">int</span> <span class="b">reserved</span><span class="f">;</span>        <span class="k">/* Reserved bytes at the end of slabs */</span>
<a name="82" /><span class="True">      82:</span>     <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">;</span>    <span class="k">/* Name (only for display!) */</span>
<a name="83" /><span class="True">      83:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">list</span><span class="f">;</span>    <span class="k">/* List of slab caches */</span>
<a name="84" /><span class="True">      84:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NZU0ZTXzA_"><span class="b">CONFIG_SYSFS</span></a>
<a name="85" /><span class="True">      85:</span>     <span class="m">struct</span> <span class="b">kobject</span> <span class="b">kobj</span><span class="f">;</span>    <span class="k">/* For sysfs */</span>
<a name="86" /><span class="True">      86:</span> <span class="f">#</span><span class="n">endif</span>
<a name="87" /><span class="False">      87:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMCG_KMEM</span>
<a name="88" /><span class="False">      88:</span>     <span class="m">struct</span> <span class="b">memcg_cache_params</span> <span class="f">*</span><span class="b">memcg_params</span><span class="f">;</span>
<a name="89" /><span class="False">      89:</span>     <span class="m">int</span> <span class="b">max_attr_size</span><span class="f">;</span> <span class="k">/* for propagation, maximum size of a stored attr */</span>
<a name="90" /><span class="True">      90:</span> <span class="f">#</span><span class="n">endif</span>
<a name="91" /><span class="True">      91:</span> 
<a name="92" /><span class="True">      92:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="93" /><span class="True">      93:</span>     <span class="k">/*</span>
<a name="94" /><span class="True">      94:</span> <span class="k">     * Defragmentation by allocating from a remote node.</span>
<a name="95" /><span class="True">      95:</span> <span class="k">     */</span>
<a name="96" /><span class="True">      96:</span>     <span class="m">int</span> <span class="b">remote_node_defrag_ratio</span><span class="f">;</span>
<a name="97" /><span class="True">      97:</span> <span class="f">#</span><span class="n">endif</span>
<a name="98" /><span class="True">      98:</span>     <span class="m">struct</span> <span class="b">kmem_cache_node</span> <span class="f">*</span><span class="b">node</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX05VTU5PREVTXzA_"><span class="b">MAX_NUMNODES</span></a><span class="f">]</span><span class="f">;</span>
<a name="99" /><span class="True">      99:</span> <span class="f">}</span><span class="f">;</span>
<a name="100" /><span class="True">     100:</span> 
<a name="101" /><span class="True">     101:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_SLUB_DEF_H */</span>
<a name="102" /><span class="True">     102:</span> </pre>
  </body>
</html>
